<template>
  <el-container class="layout-container-demo" style="height: 98vh" @mousemove="handleMouseMove"
    @mouseup="handleMouseUp">
    <el-aside :style="{ width: asideWidth + 'px' }">
      <el-scrollbar>
        <el-menu :default-openeds="['1', '3']">
          <el-sub-menu index="1">
            <template #title>
              <el-icon>
                <message />
              </el-icon>Navigator One
            </template>
            <el-menu-item-group>
              <template #title>Group 1</template>
              <el-menu-item index="1-1">Option 1</el-menu-item>
              <el-menu-item index="1-2">Option 2</el-menu-item>
            </el-menu-item-group>
            <el-menu-item-group title="Group 2">
              <el-menu-item index="1-3">Option 3</el-menu-item>
            </el-menu-item-group>
            <el-sub-menu index="1-4">
              <template #title>Option4</template>
              <el-menu-item index="1-4-1">Option 4-1</el-menu-item>
            </el-sub-menu>
          </el-sub-menu>
          <el-sub-menu index="2">
            <template #title>
              <el-icon><icon-menu /></el-icon>Navigator Two
            </template>
            <el-menu-item-group>
              <template #title>Group 1</template>
              <el-menu-item index="2-1">Option 1</el-menu-item>
              <el-menu-item index="2-2">Option 2</el-menu-item>
            </el-menu-item-group>
            <el-menu-item-group title="Group 2">
              <el-menu-item index="2-3">Option 3</el-menu-item>
            </el-menu-item-group>
            <el-sub-menu index="2-4">
              <template #title>Option 4</template>
              <el-menu-item index="2-4-1">Option 4-1</el-menu-item>
            </el-sub-menu>
          </el-sub-menu>
          <el-sub-menu index="3">
            <template #title>
              <el-icon>
                <setting />
              </el-icon>Navigator Three
            </template>
            <el-menu-item-group>
              <template #title>Group 1</template>
              <el-menu-item index="3-1">Option 1</el-menu-item>
              <el-menu-item index="3-2">Option 2</el-menu-item>
            </el-menu-item-group>
            <el-menu-item-group title="Group 2">
              <el-menu-item index="3-3">Option 3</el-menu-item>
            </el-menu-item-group>
            <el-sub-menu index="3-4">
              <template #title>Option 4</template>
              <el-menu-item index="3-4-1">Option 4-1</el-menu-item>
            </el-sub-menu>
          </el-sub-menu>
        </el-menu>
      </el-scrollbar>
    </el-aside>
    <!-- 竖线分隔：实现Aside扩展宽度 -->
    <div class="divLine" :style="{ backgroundColor: isExtend ? Colors.DivLine.Selected : Colors.DivLine.Unselected }"
      @mousedown="extendAsideWidth" @mouseenter="handleMouseEnter" @mouseleave="handleMouseLeave">
    </div>
    <el-container>
      <el-header style="text-align: right; font-size: 12px">
        <div class="toolbar">
          <el-dropdown>
            <el-icon style="margin-right: 8px; margin-top: 1px">
              <setting />
            </el-icon>
            <template #dropdown>
              <el-dropdown-menu>
                <el-dropdown-item>View</el-dropdown-item>
                <el-dropdown-item>Add</el-dropdown-item>
                <el-dropdown-item>Delete</el-dropdown-item>
              </el-dropdown-menu>
            </template>
          </el-dropdown>
          <span>Tom</span>
        </div>
      </el-header>
      <!-- 画布组件 -->
      <InfiniteCanvas />
      <el-main style="margin-top: 2px;">
      </el-main>
    </el-container>
  </el-container>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import InfiniteCanvas from "./components/infinite_canvas/InfiniteCanvas.vue";
import { Menu as IconMenu, Message, Setting } from '@element-plus/icons-vue'
import { MouseListener } from './utils/MouseListener';
import { MouseStyle, CursorStyle } from './utils/MouseStyle';
import Colors from './assets/styles/colors.ts'

const mouseListener = MouseListener.getInstance();//鼠标事件监听器
const isExtend = ref(false); // 正在扩展Aside的width
const asideWidth = ref(200);    //侧边栏宽度

/**
 * 准备扩展Aside宽度
 */
const extendAsideWidth = () => {
  isExtend.value = true;
}

/**
 * 处理鼠标准备扩展Aside宽度时的样式
 */
const handleMouseEnter = () => {
  MouseStyle.setCursor(CursorStyle.EwResize);
}

/**
 * 不扩展Aside宽度时鼠标样式恢复默认
 */
const handleMouseLeave = () => {
  if (!isExtend.value)
    MouseStyle.setCursor(CursorStyle.Default);
}

/**
 * 若当前处于扩展Aside宽度状态则进行扩展，否则返回
 * @param event 鼠标移动事件
 */
const handleMouseMove = (event: MouseEvent) => {
  if (!isExtend.value) return;
  let x = event.clientX;
  if (mouseListener.isLeftButtonPressed() && x >= 200 && x < 300) {
    asideWidth.value = x;
  }
};

/**
 * 修改扩展Aside状态为false
 */
const handleMouseUp = () => {
  if (isExtend.value)
    MouseStyle.setCursor(CursorStyle.Default);
  isExtend.value = false;

}
</script>

<style scoped>
/*  分割线默认样式  */
.divLine {
  width: 8px;
}

.layout-container-demo .el-header {
  position: relative;
  background-color: var(--el-color-primary);
  color: var(--el-text-color-primary);
}

/* 加下边框线 */
.el-header {
  border-bottom: 3px solid var(--el-header-border-bottom-color);
}

.layout-container-demo .el-aside {
  color: var(--el-text-color-primary);
  background: var(--el-color-primary);
}

.layout-container-demo .el-menu {
  border-right: none;
}

.layout-container-demo .el-main {
  padding: 0;
}

.layout-container-demo .toolbar {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  height: 100%;
  right: 20px;
}
</style>
